import { Provide, Inject } from '@midwayjs/core';
import { Context } from '@midwayjs/koa';
import * as ExcelJS from 'exceljs';
import { StatusEnum, SexEnum, DelFlagEnum } from "@utils/enum";

interface OptionsType {
  headers: any[];
  data: any[];
  dictMap?: Record<string, any>;
  sheetName?: string;
  dropdownOptions?: DropdownOptions;
}

interface DropdownOption {
  data: string[];
  dependency?: {
    column: string;
    mapping: Record<string, string[]>;
  };
}

interface DropdownOptions {
  [key: string]: DropdownOption;
}

/**
 * 通用枚举映射配置
 */
export const commonExportMap = {
  status: {
    [StatusEnum.NORMAL]: '正常',
    [StatusEnum.STOP]: '停用',
  },
  sex: {
    [SexEnum.MAN]: '男',
    [SexEnum.WOMAN]: '女',
  },
  delFlag: {
    [DelFlagEnum.NORMAL]: '正常',
    [DelFlagEnum.DELETE]: '已删除',
  },
};

@Provide()
export class DownloadExcelService {
  @Inject()
  ctx: Context;

  /**
   * 导出excel文件，多表头的暂不考虑
   * @param options Object: {
   *   headers: [{}] // 表头
   *   data: [] // 数据
   *   dictMap?: {} // 字典映射
   *   sheetName?: string // sheet名称
   * }
   */
  async downloadExcel(options: OptionsType) {
    // const { headers, data, sheetName = 'Sheet1', dictMap, dropdownOptions } = options;
    const { headers, data, sheetName = 'Sheet1', dictMap } = options;
    const workbook = new ExcelJS.Workbook();
    const worksheet = workbook.addWorksheet(sheetName);

    // 1. 添加表头
    this.addHeaders(worksheet, headers);

    // 2. 添加数据
    this.addData(worksheet, headers, data, dictMap);

    // // 3. 添加下拉选项 (待完善)
    // if (dropdownOptions) {
    //   await this.addDropdownOptions(workbook, worksheet, headers, dropdownOptions);
    // }

    // 4. 设置样式
    this.setHeaderStyle(worksheet);

    // 返回生成的 Excel 文件
    return this.generateExcelFile(workbook, sheetName);
  }

  /**
   * 添加表头
   */
  private addHeaders(worksheet: ExcelJS.Worksheet, headers: any[]) {
    worksheet.columns = headers.map((column) => {
      return {
        header: column.label,
        key: column.prop,
        width: isNaN(column.width) ? 16 : column.width,
      };
    });
  }

  /**
   * 添加数据到工作表
   */
  private addData(worksheet: ExcelJS.Worksheet, headers: any[], data: any[], dictMap?: Record<string, any>) {
    data.forEach((item) => {
      const row = headers.reduce((acc, field) => {
        const value = item[field.prop];
        acc[field.prop] = dictMap?.[field.prop]?.[value] ?? value;
        return acc;
      }, {});
      worksheet.addRow(row);
    });
  }

  /**
   * 添加下拉选项（如果有）
   */
  // private async addDropdownOptions(workbook: ExcelJS.Workbook, worksheet: ExcelJS.Worksheet, headers: any[], dropdownOptions: DropdownOptions) {
  //   const dictSheet = workbook.addWorksheet('_dict');
  //   // dictSheet.state = 'hidden';  // 隐藏字典表

  //   // 创建字典映射，存储级联关系
  //   for (const [column, config] of Object.entries(dropdownOptions)) {
  //     const colIndex = headers.findIndex((header) => header.prop === column) + 1;

  //     // 2. 设置普通下拉选项
  //     if (!config.dependency) {
  //       // 普通下拉选项，设置默认值
  //       await this.addDropdownForColumn(worksheet, column, colIndex, config.data);
  //     } else {
  //       console.log('处理级联下拉选项')

  //       // 3. 处理级联下拉选项
  //       const { column: depColumn, mapping } = config.dependency;
  //       const depColIndex = headers.findIndex(header => header.prop === depColumn) + 1; // 获取依赖列的索引
  //       const depColLetter = String.fromCharCode(64 + depColIndex); // 获取依赖列的字母（A, B, C...）

  //       console.log('depColIndex', depColIndex);
  //       console.log('depColLetter', depColLetter);

  //       // 将映射数据写入字典工作表，并为每个映射创建一个范围
  //       dictSheet.addRow([`${column}_mapping`]);
  //       Object.entries(mapping).forEach(([key, values]) => {
  //         dictSheet.addRow([key, ...values]);
  //       });

  //       // // 4. 设置级联下拉选项，确保第二行有默认值
  //       // // 获取依赖列第二行的值
  //       // worksheet.getCell(`${depColLetter}2`).value = worksheet.getCell(`${depColLetter}2`).value || Object.keys(mapping)[0];

  //       // // 获取依赖列第二行的值并根据这个值设置默认选项
  //       // // 确保 cell.value 是 string 或 number
  //       // const depCellValue = worksheet.getCell(`${depColLetter}2`).value;

  //       // if (typeof depCellValue === 'string' || typeof depCellValue === 'number') {
  //       //   const defaultValue = mapping[depCellValue] ? mapping[depCellValue][0] : '';
  //       //   worksheet.getCell(`${String.fromCharCode(64 + colIndex)}2`).value = defaultValue;
  //       // } else {
  //       //   // 如果不是 string 或 number，处理为默认值
  //       //   worksheet.getCell(`${String.fromCharCode(64 + colIndex)}2`).value = '';
  //       // }
  //       dictSheet.eachRow({ includeEmpty: true }, (row, rowNumber) => {
  //         console.log(`Row ${rowNumber}:`, row.values);
  //       });

  //       // 设置数据验证
  //       worksheet.getColumn(colIndex).eachCell((cell, rowNumber) => {
  //         if (rowNumber > 1) {
  //           // 使用 INDIRECT 引用字典表中的映射数据
  //           const formula = `=INDIRECT("${column}_mapping!${depColLetter}${rowNumber}")`;
  //           console.log('formula', formula)
  //           try {
  //             // 设置数据验证
  //             cell.dataValidation = {
  //               type: 'list',
  //               formulae: [formula],  // 级联下拉列表
  //               allowBlank: false,
  //               error: '请从下拉列表中选择有效选项',
  //               errorStyle: 'stop',
  //               showErrorMessage: true,
  //               showInputMessage: true,
  //               promptTitle: '选择提示',
  //               prompt: `从 ${column} 列中选择`
  //             };
  //           } catch (error) {
  //             console.error('设置数据验证时出错:', error);
  //             console.error('出错的单元格:', `行 ${rowNumber}`, '公式:', formula);
  //           }
  //         }
  //       });
  //     }
  //   }
  // }

  /**
   * 为指定列添加下拉选项
   */
  async addDropdownForColumn(worksheet: ExcelJS.Worksheet, column: string, colIndex: number, dropdownOptions: string[]) {
    // 设置第二行的默认值为下拉列表中的第一个选项
    worksheet.getCell(`${String.fromCharCode(64 + colIndex)}2`).value = dropdownOptions[0];

    // 设置数据验证为下拉选项
    const validationFormula = `"${dropdownOptions.join(',')}"`;

    worksheet.getColumn(colIndex).eachCell((cell, rowNumber) => {
      if (rowNumber > 1) { // 跳过第一行（表头）
        cell.dataValidation = {
          type: 'list',
          formulae: [validationFormula],  // 下拉列表选项
          allowBlank: false,
          error: '无效的选择',
          errorStyle: 'stop',
          showErrorMessage: true,
          showInputMessage: true,
          promptTitle: '请选择',
          prompt: `从 ${column} 列中选择`
        };
      }
    });
  }




  /**
   * 设置表头样式
   */
  private setHeaderStyle(worksheet: ExcelJS.Worksheet) {
    const headerStyle: ExcelJS.Style = {
      font: { size: 10, bold: true, color: { argb: 'ffffff' } },
      alignment: { vertical: 'middle', horizontal: 'center' },
      fill: { type: 'pattern', pattern: 'solid', fgColor: { argb: '808080' } },
      border: {
        top: { style: 'thin', color: { argb: '9e9e9e' } },
        left: { style: 'thin', color: { argb: '9e9e9e' } },
        bottom: { style: 'thin', color: { argb: '9e9e9e' } },
        right: { style: 'thin', color: { argb: '9e9e9e' } },
      },
      // 添加默认值，以防缺失属性
      numFmt: undefined, // 可选，数字格式
      protection: undefined, // 可选，单元格保护
    };

    const headerRow = worksheet.getRow(1);
    headerRow.eachCell((cell) => {
      cell.style = headerStyle;
    });

    worksheet.columns.forEach((column) => {
      column.alignment = { vertical: 'middle', horizontal: 'center' };
    });
  }

  /**
   * 生成 Excel 文件
   */
  private async generateExcelFile(workbook: ExcelJS.Workbook, sheetName: string) {
    this.ctx.set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    this.ctx.set('Content-Disposition', `attachment;filename*=UTF-8''${encodeURIComponent(sheetName)}.xlsx`);
    return await workbook.xlsx.writeBuffer();
  }
}
